/// 自动生成的代码，请勿修改
///
/// 生成时间：<%= new Date().toLocaleString() %>
<%# 头部引用，当前接口、类型需要引用的其他的接口、类型、枚举等 -%>
<%_ if (apifoxRefs.length > 0) { -%>
import './<%- apifoxRefs[0].refFileBasename %>.dart';
<%_ } -%>
<%_ if (refs.length > 0) { -%>
  <%_ refs.forEach(function(ref){ -%>
import './<%- ref.refFileBasename %>.dart';
  <%_ }) -%>
<%_ } -%>

<%# 如果不是对象和枚举类型，直接生成type类型即可 -%>
<%_ if (!['OBJECT', 'ENUM', 'REF'].includes(interfaceType)) { -%>
// APIfox中不要直接定义基础类型、数组类型、交叉类型的模型。不知道怎么生成
<%_ } -%>
<%# 如果是枚举类型，遍历生成枚举类型 -%>
<%_ if (interfaceType === 'ENUM') { -%>
enum <%= name %> {
  <%_ config.enums.forEach(function({ enumKey, enumValue }){ -%>
  <%- enumKey %>(<%- enumValue %>),
  <%_ }) -%>
  ;

  final <%- config.type === 'number' ? 'int' : 'String' %> value;
  const <%- name %>(this.value);
}
<%_ } -%>
<%# 如果是对象类型，遍历生成对象类型 -%>
<%_ if (interfaceType === 'OBJECT' || interfaceType === 'REF') { -%>
  <%_ if (interfaceType === 'OBJECT') { -%>
class <%= name %><% if (apifoxProps.length > 0) { %> extends <%= apifoxRefs[0].ref %><% } %> {
  <%_ } -%>
  <%_ if (interfaceType === 'REF') { -%>
class <%= name %> extends <%= displayType %> {
  <%_ } -%>
  <%_ if (interfaceType === 'OBJECT') { -%>
    <%_ Object.entries(config).forEach(function([key, value]){ -%>
      <%_ if (!apifoxProps.includes(key)) { -%>
        <%_ if (value.descriptions.length > 0) { -%>
          <%_ value.descriptions.forEach(function(description){ -%>
  /// <%- description %>
          <%_ }) -%>
        <%_ } -%>
  <% if (value.required) { %>late <% } %><%- value.displayType %><% if (!value.required) { %>?<% } %> <%= key %>;

      <%_ } -%>
    <%_ }) -%>
  <%_ } -%>
  <%- name %>();

  @override
  String toString() {
  <%_ if (interfaceType === 'OBJECT') { -%>
    return '<%- name %>[<% Object.entries(config).forEach(function([key, value]){ -%><%- key %>=$<%- key %>, <%})%>]';
  <%_ } -%>
  <%_ if (interfaceType === 'REF') { -%>
    <%_ if (!['OBJECT'].includes(config.refConfig.interfaceType)) { -%>
    return super.toString();
    <%_ } -%>
    <%_ if (['OBJECT'].includes(config.refConfig.interfaceType)) { -%>
    return '<%- name %>[<% Object.entries(config.refConfig.config).forEach(function([key, value]){ -%><%- key %>=$<%- key %>, <%})%>]';
    <%_ } -%>
  <%_ } -%>
  }

  <%_ if (interfaceType === 'REF' || apifoxProps.length > 0) { -%>
  @override
  <%_ } -%>
  <%- name %>.fromJson(Map<String, dynamic> json)<% if (interfaceType === 'REF' || apifoxProps.length > 0) { %> : super.fromJson(json)<% } %> {
  <%_ if (interfaceType === 'OBJECT') { -%>
    <%_ Object.entries(config).forEach(function([key, value]){ -%>
      <%_ if (!apifoxProps.includes(key)) { -%>
    if(json['<%- key %>'] != null) {
        <%_ if (['SIMPLE'].includes(value.interfaceType)) { -%>
      <%- key %> = json['<%- key %>'];
        <%_ } -%>
        <%_ if (['OBJECT'].includes(value.interfaceType)) { -%>
      <%- key %> = <%- value.displayType %>.fromJson(json['<%- key %>']);
        <%_ } -%>
        <%_ if (['REF'].includes(value.interfaceType)) { -%>
          <%_ if (value.config.refConfig.interfaceType === 'OBJECT') { -%>
      <%- key %> = <%- value.displayType %>.fromJson(json['<%- key %>']);
          <%_ } -%>
          <%_ if (value.config.refConfig.interfaceType === 'ENUM') { -%>
      <%- key %> = <%- value.displayType %>.values
            <%_ if (value.required) { -%>
        .firstWhere((element) => element.value == json['<%- key %>']);
            <%_ } -%>
            <%_ if (!value.required) { -%>
        .firstWhere((element) => element.value == json['<%- key %>'],
            orElse: () => null);
            <%_ } -%>
          <%_ } -%>
        <%_ } -%>
        <%_ if (['ENUM'].includes(value.interfaceType)) { -%>
      <%- key %> = <%- value.displayType %>.values
          <%_ if (value.required) { -%>
        .firstWhere((element) => element.value == json['<%- key %>']);
          <%_ } -%>
          <%_ if (!value.required) { -%>
        .firstWhere((element) => element.value == json['<%- key %>'],
            orElse: () => null);
          <%_ } -%>
        <%_ } -%>
        <%_ if (['ARRAY'].includes(value.interfaceType)) { -%>
          <%_ if (value.config.interfaceType === 'SIMPLE') { -%>
      <%- key %> = <%- value.displayType %>.from(json['<%- key %>']);
          <%_ } -%>
          <%_ if (value.config.interfaceType !== 'SIMPLE') { -%>
      <%- key %> = <%- value.config.refs[0].ref %>.listFromJson(json['<%- key %>']);
          <%_ } -%>
        <%_ } -%>
        <%_ if (['INTERSECTION'].includes(value.interfaceType)) { -%>
    // 交叉类型不知道怎么生成，暂不支持，请不要在apifox中使用allOf定义类型
        <%_ } -%>
    }
      <%_ } -%>
    <%_ }) -%>
  <%_ } -%>
  }

  <%_ if (interfaceType === 'REF' || apifoxProps.length > 0) { -%>
  @override
  <%_ } -%>
  Map<String, dynamic> toJson() {
    Map<String, dynamic> json = <%- interfaceType === 'REF' || apifoxProps.length > 0 ? 'super.toJson()' : '{}' %>;
  <%_ if (interfaceType === 'OBJECT') { -%>
    <%_ Object.entries(config).forEach(function([key, value]){ -%>
      <%_ if (!apifoxProps.includes(key)) { -%>
        <%_ if (!value.required) { -%>
    if (<%- key %> != null) {
        <%_ } -%>
        <%_ if (['SIMPLE'].includes(value.interfaceType)) { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
        <%_ } -%>
        <%_ if (['OBJECT'].includes(value.interfaceType)) { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.toJson();
        <%_ } -%>
        <%_ if (['ARRAY'].includes(value.interfaceType)) { -%>
          <%_ if (['SIMPLE'].includes(value.config.interfaceType)) { -%>
    // TODO 简单类型的数组不知道怎么生成，暂时先这样1
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
          <%_ } -%>
          <%_ if (['ENUM'].includes(value.config.interfaceType)) { -%>
    // TODO 枚举类型的数组不知道怎么生成，暂时先这样2
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
          <%_ } -%>
          <%_ if (value.config.interfaceType === 'OBJECT') { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.map((e) => e.toJson()).toList();
          <%_ } -%>
          <%_ if (value.config.interfaceType === 'REF') { -%>
            <%_ if (value.config.config.refConfig.interfaceType === 'ENUM') { -%>
    // TODO 枚举类型的数组不知道怎么生成，暂时先这样21
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
            <%_ } -%>
            <%_ if (value.config.config.refConfig.interfaceType === 'OBJECT') { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.map((e) => e.toJson()).toList();
            <%_ } -%>
            <%_ if (!['ENUM', 'OBJECT'].includes(value.config.config.refConfig.interfaceType)) { -%>
    // TODO 不知道怎么生成，暂时先这样5
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
            <%_ } -%>
          <%_ } -%>
          <%_ if (['ARRAY', 'INTERSECTION'].includes(value.config.interfaceType)) { -%>
    // TODO 不知道怎么生成，暂时先这样3
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %>;
          <%_ } -%>
        <%_ } -%>
        <%_ if (['ENUM'].includes(value.interfaceType)) { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.value;
        <%_ } -%>
        <%_ if (['REF'].includes(value.interfaceType)) { -%>
          <%_ if (value.config.refConfig.interfaceType === 'ENUM') { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.value;
          <%_ } -%>
          <%_ if (value.config.refConfig.interfaceType === 'OBJECT') { -%>
    <% if (!value.required) { %>  <% } %>json['<%- key %>'] = <%- key %><% if (!value.required) { %>?<% } %>.toJson();
          <%_ } -%>
          <%_ if (!['ENUM', 'OBJECT'].includes(value.config.refConfig.interfaceType)) { -%>
    // TODO 不知道怎么生成，暂时先这样4
          <%_ } -%>
        <%_ } -%>
        <%_ if (['INTERSECTION'].includes(value.interfaceType)) { -%>
    // 交叉类型不知道怎么生成，暂不支持，请不要在apifox中使用allOf定义类型
        <%_ } -%>
        <%_ if (!value.required) { -%>
    }
        <%_ } -%>
      <%_ } -%>
    <%_ }) -%>
  <%_ } -%>
    return json;
  }

  static List<<%- name %>> listFromJson(List<dynamic> json) {
    return json.map((value) => <%- name %>.fromJson(value)).toList();
  }

  static Map<String, <%- name %>> mapFromJson(Map<String, dynamic> json) {
    var map = <String, <%- name %>>{};
    if (json.isNotEmpty) {
      json.forEach((String key, dynamic value) =>
          map[key] = <%- name %>.fromJson(value));
    }
    return map;
  }

  static Map<String, List<<%- name %>>> mapListFromJson(
      Map<String, dynamic> json) {
    var map = <String, List<<%- name %>>>{};
    if (json.isNotEmpty) {
      json.forEach((String key, dynamic value) {
        map[key] = <%- name %>.listFromJson(value);
      });
    }
    return map;
  }
}
<%_ } -%>
